package com.qt;

import java.util.function.Function;
import java.util.function.IntBinaryOperator;
import java.util.function.IntConsumer;
import java.util.function.IntPredicate;

public class lambdaDemo01 {

    public static void main(String[] args) {

        /**
         * Lambda表达式

         * Lambda是JDK8中的语法糖，它可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象，而是更关注我们对数据进行了什么操作。写Lambda记得看底层源码。
         * 关注的是参数列表和具体的逻辑代码体
         * 省略规则:
         * 参数类型可以省略
         * 方法体中只有一句代码时大括号return和唯一一句代码的分号可以省略
         * 方法只有一个参数时小括号可以省略
         */
        //是一个结果的匿名内部类，并且只有一个抽象方法的时候
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我开启了一个线程");
            }
        }).start();

        new Thread(
                ()-> {System.out.println("我开启了一个线程");}
        ).start();

//        int i = calculateNum(new IntBinaryOperator() {
////            @Override
////            public int applyAsInt(int left, int right) {
////                return left + right;
////            }
////        });

        /**
         * 使用alt + 回车可以进行 匿名内部类和lambda的互相转换
         */

//        int j = calculateNum((left, right) -> left + right);
//        System.out.println(j);

//        printNum(new IntPredicate() {
//            @Override
//            public boolean test(int value) {
//                return value % 2 == 0;
//            }
//        });
//
//        printNum((int value)->{return value%2 == 0;});


        //案例3
//        Integer integer = typeConver(new Function<String, Integer>() {
//            @Override
//            public Integer apply(String s) {
//                return Integer.valueOf(s);
//            }
//        });

//        Integer integer = typeConver((String s) -> {
//            return Integer.valueOf(s);
//        });
//        System.out.println(integer);

        //案例4
//        foreachArr(new IntConsumer() {
//            @Override
//            public void accept(int value) {
//                System.out.println(value);
//            }
//        });
//
        foreachArr(value -> System.out.println(value));





    }

    public static void foreachArr(IntConsumer consumer){

        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        for (int i : arr) {
            consumer.accept(i);
        }

    }



    public static <R> R typeConver(Function<String,R> function){
        String str = "1235";
        R result = function.apply(str);
        return result;
    }



    public static void printNum(IntPredicate predicate){
        int[] arr = {1,2,3,4,5,6,7,8,9,10};
        for (int i : arr) {
            if(predicate.test(i)){
                System.out.println(i);
            }
        }
    }


    public static int calculateNum(IntBinaryOperator operator){
        int a = 10;
        int b = 20;

        return operator.applyAsInt(a,b);
    }

}
